package org.flower.isme.common.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;


/**
 * Redis配置类
 * 该类用于配置Redis连接和模板，以便在应用程序中使用Redis。
 */
@Configuration
public class RedisConfig {
    /**
     * Redis服务器主机地址
     */
    @Value("${spring.data.redis.host}")
    private String redisHost;

    /**
     * Redis服务器端口
     */
    @Value("${spring.data.redis.port}")
    private int redisPort;

    /**
     * Redis服务器密码
     */
    @Value("${spring.data.redis.password}")
    private String redisPassword;

    /**
     * 配置并返回RedisConnectionFactory
     * 使用LettuceConnectionFactory创建Redis连接工厂，并配置主机、端口和密码。
     *
     * @return RedisConnectionFactory
     */
    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        // 创建LettuceConnectionFactory实例
        LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisHost, redisPort);
//         设置Redis密码
        lettuceConnectionFactory.setPassword(redisPassword);
//         返回配置好的Redis连接工厂
        return lettuceConnectionFactory;
    }

    /**
     * 配置并返回RedisTemplate
     * 创建Redis模板实例，配置键值序列化方式，并关联到RedisConnectionFactory。
     *
     * @param redisConnectionFactory Redis连接工厂
     * @return RedisTemplate
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        // 创建Redis模板实例
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 设置Redis连接工厂
        template.setConnectionFactory(redisConnectionFactory);
        // 设置键的序列化方式为StringRedisSerializer
        template.setKeySerializer(new StringRedisSerializer());
        // 设置值的序列化方式为GenericJackson2JsonRedisSerializer
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        // 返回配置好的Redis模板实例
        return template;
    }

}
